package test23.homework;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 定义PrivateTest类，有私有name属性，并且属性值为hellokitty
 * 提供getName的公有方法
 * 创建PrivateTest的类，利用Class类得到私有的name属性，修改私有的name属性值，并调用getName()的方法打印name属性值
 */
public class Homework02 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException {
        //1. 得到 PrivateTest类对应的Class对象
        Class<?> privateCls = Class.forName("test23.homework.PrivateTest");
        //2. 创建对象实例
        Object o = privateCls.newInstance();
        //3. 得到name属性对象
        Field name = privateCls.getDeclaredField("name");
        //4. 暴破name
        name.setAccessible(true);
        name.set(o,"天龙八部");
        //5. 得到getName方法对象
        Method getName = privateCls.getDeclaredMethod("getName");
        //6. 因为getName() 是public，所以直接调用
        Object invoke = getName.invoke(o);
        System.out.println(invoke);//天龙八部
    }
}
class PrivateTest{
    private String name="hellokitty";
    //默认无参构造器
    public String getName() {
        return name;
    }
}